/*
 *    Copyright (c) 2018-2025, lengleng All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * Neither the name of the pig4cloud.com developer nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 * Author: lengleng (wangiegie@gmail.com)
 */

package com.pig4cloud.pigx.contract.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel;
import com.pig4cloud.pigx.common.log.annotation.SysLog;
import com.pig4cloud.pigx.contract.bo.ContractStatisticsBO;
import com.pig4cloud.pigx.contract.entity.ContractOrder;
import com.pig4cloud.pigx.contract.entity.ContractOrderHistory;
import com.pig4cloud.pigx.contract.enums.ContractOrderEnum;
import com.pig4cloud.pigx.contract.service.ContractOrderHistoryService;
import com.pig4cloud.pigx.contract.utils.ContractUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.format.DateTimeFormatter;
import java.util.List;

/**
 * 历史订单表
 *
 * @since 2022-08-11 10:08:00
 */
@RestController
@RequiredArgsConstructor
@RequestMapping("/contractorderhistory")
@Api(value = "contractorderhistory", tags = "历史订单表管理")
public class ContractOrderHistoryController {

	private final ContractOrderHistoryService contractOrderHistoryService;

	private final ContractUtils utils;

	/**
	 * 历史委托分页查询
	 *
	 * @param page          分页对象
	 * @param contractOrder 订单表
	 * @return
	 */
	@ApiOperation(value = "分页查询", notes = "分页查询")
	@GetMapping("/page")
	public R<ContractStatisticsBO<ContractOrderHistory>> getContractOrderHistoryPage(Page<ContractOrderHistory> page, ContractOrderHistory contractOrder) {
		QueryWrapper<ContractOrderHistory> wrapper = new QueryWrapper<>();
		wrapper.eq("is_robot","0");
		wrapper.notIn("status",
				ContractOrderEnum.Status.ON_GOING.getValue(),
				ContractOrderEnum.Status.PARTIAL_DEAL.getValue());
		if (contractOrder.getIsHas() != null) {
			if ("0".equals(contractOrder.getIsHas())) {
				wrapper.eq("has_stop_lost", "0");
				wrapper.eq("has_stop_profit", "0");
			} else {
				wrapper.eq("has_stop_lost", "1").or().eq("has_stop_profit", "1");
			}
		}
		if (contractOrder.getCreateTime() != null) {
			String time = contractOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
			wrapper.like("create_time", time);
		}
		if (contractOrder.getSymbolId() != null) {
			wrapper.eq("symbol_id",contractOrder.getSymbolId());
		}
		if (contractOrder.getId() != null) {
			wrapper.like("id",contractOrder.getId());
		}
		if (contractOrder.getUserId() != null) {
			wrapper.like("user_id",contractOrder.getUserId());
		}
		if (contractOrder.getStatus() != null && !contractOrder.getStatus().isEmpty()) {
			wrapper.eq("status",contractOrder.getStatus());
		}
		if (contractOrder.getSide() != null && !contractOrder.getSide().isEmpty()) {
			wrapper.eq("side",contractOrder.getSide());
		}
		wrapper.orderByDesc("create_time");
		Page<ContractOrderHistory> historyPage = contractOrderHistoryService.page(page, wrapper);
		for (ContractOrderHistory record : historyPage.getRecords()) {
			utils.setScaleBySymbol(record,record.getSymbolName());
		}
		ContractOrderHistory one = contractOrderHistoryService.getBaseMapper().selectOne(
				wrapper.select("sum(profit_rate) 'profitRate'",
						"sum(profit)'profit'",
						"sum(num)'num'",
						"sum(deal_num)'dealNum'")
		);
		ContractStatisticsBO<ContractOrderHistory> bo = new ContractStatisticsBO<>();
		bo.setPage(historyPage);
		bo.setStatistics(one);
		return R.ok(bo);
	}

	/**
	 * 通过id查询历史订单表
	 *
	 * @param id id
	 * @return R
	 */
	@ApiOperation(value = "通过id查询", notes = "通过id查询")
	@GetMapping("/{id}")
	public R getById(@PathVariable("id") Long id) {
		return R.ok(contractOrderHistoryService.getById(id));
	}

	/**
	 * 新增历史订单表
	 *
	 * @param contractOrderHistory 历史订单表
	 * @return R
	 */
	@ApiOperation(value = "新增历史订单表", notes = "新增历史订单表")
	@SysLog("新增历史订单表")
	@PostMapping
	@PreAuthorize("@pms.hasPermission('contract_contractorderhistory_add')")
	public R save(@RequestBody ContractOrderHistory contractOrderHistory) {
		return R.ok(contractOrderHistoryService.save(contractOrderHistory));
	}

	/**
	 * 修改历史订单表
	 *
	 * @param contractOrderHistory 历史订单表
	 * @return R
	 */
	@ApiOperation(value = "修改历史订单表", notes = "修改历史订单表")
	@SysLog("修改历史订单表")
	@PutMapping
	@PreAuthorize("@pms.hasPermission('contract_contractorderhistory_edit')")
	public R updateById(@RequestBody ContractOrderHistory contractOrderHistory) {
		return R.ok(contractOrderHistoryService.updateById(contractOrderHistory));
	}

	/**
	 * 通过id删除历史订单表
	 *
	 * @param id id
	 * @return R
	 */
	@ApiOperation(value = "通过id删除历史订单表", notes = "通过id删除历史订单表")
	@SysLog("通过id删除历史订单表")
	@DeleteMapping("/{id}")
	@PreAuthorize("@pms.hasPermission('contract_contractorderhistory_del')")
	public R removeById(@PathVariable Long id) {
		return R.ok(contractOrderHistoryService.removeById(id));
	}


	/**
	 * 导出excel 表格
	 *
	 * @param contractOrderHistory 查询条件
	 * @return excel 文件流
	 */
	@ResponseExcel
	@GetMapping("/export")
	@PreAuthorize("@pms.hasPermission('contract_contractorderhistory_export')")
	public List<ContractOrderHistory> export(ContractOrderHistory contractOrderHistory) {
		return contractOrderHistoryService.list(Wrappers.query(contractOrderHistory));
	}
}
